X に書ききれないことはここに

X に書ききれないことはここに

ESP32 でヤマハのAVアンプを叩く

概要

ヤマハのAVアンプはスマホアプリなどネットワーク経由で操作ができるので、実際に ESP32 を使って wifi 経由での操作を試してみました。

通信プロトコル

公式に仕様書が配布されているところは見つけられなかったのですが “Yamaha Extended Control API Specification” と検索することで仕様書がみつかりました。HTTP で接続して GET (一部コマンドは POST) で操作できるようです。なお未確認ですが現行製品ではプロトコルが違うかもしれません。

用意したもの

  • ESP32 開発基板 + 配線 (前回と同じもの)
  • Yamaha Extended Control API Specification (Basic) (仕様書)
  • Arduino IDE + esp32

サンプルコード

ボタンを押すたびにミュート on/off を切り替えるサンプル。

  • YamahaAVR, SSID, PASSWORD は要書き換え
#include <arduino.h>
#include <wifi.h>
#include <httpclient.h>

const char SSID[] = "ssid";
const char PASSWORD[] = "12345678";
const IPAddress YamahaAVR(192,168,0,20);
const String COMMAND_setMute_true  = String("http://") + YamahaAVR.toString() + String("/YamahaExtendedControl/v1/main/setMute?enable=true");
const String COMMAND_setMute_false = String("http://") + YamahaAVR.toString() + String("/YamahaExtendedControl/v1/main/setMute?enable=false");

volatile bool g_mute = false;
volatile bool g_irq0 = false;
void ISR0(){
  g_irq0 = true;
}

void setup() {
  Serial.begin(115200);

  pinMode(14, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(14), ISR0, FALLING);

  WiFi.begin(SSID, PASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.printf("WiFi connected\r\n");
}

void loop() {
  if(g_irq0){
    HTTPClient http;
    http.begin(g_mute ? COMMAND_setMute_false : COMMAND_setMute_true);
    int code = http.GET();
    String response = http.getString();

    Serial.printf("setMute (%d)\r\n", code);
    Serial.printf("%s\r\n", response.c_str());

    g_mute = !g_mute;
    g_irq0 = false;
  }
}